package generic;

import java.util.Arrays;
import java.util.List;

/**
 * @author ChangLiang
 * @date 2021/2/1
 */
public class CompilerIntelligence {
    public static void main(String[] args) {

        List<? extends Fruit> flist = Arrays.asList(new Apple());

        Apple a = (Apple)flist.get(0); // No warning

        /**
         * contains()和indexOf()的調用，这两个方法都接受Apple对象作为参数，而
         * 这些调用都可以正常执行。
         * 这是否意味着编译器实际上将检查代码，以查看是否有某个特定的
         * 方法修改了它的对象？
         *
         * 在使用contains()和indexOf()时，参数类型是Object ，因此不涉及任何通配符， 而编译器也
         * 将允许这个调用。
         * 这意味着将由泛型类的设计者来决定哪些调用是“安全的"，并使用Object类型作为其参数类型。
         */

        flist.contains(new Apple()); // Argument is 'Object'

        flist.indexOf(new Apple()); // Argument is 'Object'
    }
}
